﻿//一元表达式求值
#include<iostream>
#include<cstring>
#include<algorithm> //isdigit()
#include<stack> //栈
#include<unordered_map>  //哈希表
//map 容器中存储的数据是有序的，而 unordered_map 容器中是无序的
//以键值对（pair类型）的形式存储数据
//unordered_map 容器底层采用的是哈希表存储结构，该结构本身不具有对数据的排序功能，此容器内部不会自行对存储的键值对进行排序。

using namespace std;

stack<int>num; //数字
stack<char>op;//运算符

void eval()
{
    auto b = num.top();   num.pop();
    auto a = num.top();   num.pop();
    auto c = op.top();    op.pop();
    int x;
    if (c == '+')  x = a + b;
    else if (c == '-') x = a - b;
    else if (c == '*') x = a * b;
    else  x = a / b;
    num.push(x);
}
int main()
{
    unordered_map<char, int> pr{ {'+',1},{'-',1},{'*',2},{'/',2} }; //哈希组定义优先级
    //unordered_map<char,int> pr={{'+',1},{'-',1},{'*',2},{'/',2}};

    string str;
    cin >> str;
    for (int i = 0; i < str.size(); i++)//从前往后获取每一个字符
    {
        auto c = str[i];
        //auto这个关键字来代替一个具体变量的类型定义，让编译器自己去寻找和从它的初始化过程中来推演这个变量的类型。
        if (isdigit(c))//数字
        {
            int x = 0, j = i; //
            while (j < str.size() && isdigit(str[j]))
                x = x * 10 + str[j++] - '0';//转换数字
            num.push(x);
            //j=i-1;
            i = j - 1;
        }
        else if (c == '(') op.push(c);
        //右括号出现,从右往左计算栈中数据,直到遇见左括号
        else if (c == ')')
        {
            while (op.top() != '(')    eval();
            op.pop();//左括号出栈
        }
        else
        {
            while (op.size() && pr[op.top()] >= pr[c]) eval();//如果栈顶运算符优先级较高,先操作栈顶元素再入栈
            //如果栈顶运算符优先级较低,直接入栈
            op.push(c);
        }
    }
    while (op.size()) eval(); //未操作过的操作一遍
    cout << num.top() << endl; //栈顶元素就是答案
    return 0;
}


/*总结
1.unordered_map<char,int> pr={。。}，没有等号哦
2.isdight别写错啦
3.isdigit[j]不对啊，isdigit[str[j]]
4.if(op.size() &&..)  op.size()！！
5.pr[op.top]不对 top()括号!!
6.while (op.size())  不是str.size()
7.
*/